home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 11047 / 11047.xpi / content / script-compiler.js < prev    next >
Text File  |  2009-06-11  |  9KB  |  311 lines

  1. var youtube2mp3_gmCompiler={
  2.  
  3. // getUrlContents adapted from Greasemonkey Compiler
  4. // http://www.letitblog.com/code/python/greasemonkey.py.txt
  5. // used under GPL permission
  6. //
  7. // most everything else below based heavily off of Greasemonkey
  8. // http://greasemonkey.mozdev.org/
  9. // used under GPL permission
  10.  
  11. getUrlContents: function(aUrl){
  12.     var    ioService=Components.classes["@mozilla.org/network/io-service;1"]
  13.         .getService(Components.interfaces.nsIIOService);
  14.     var    scriptableStream=Components
  15.         .classes["@mozilla.org/scriptableinputstream;1"]
  16.         .getService(Components.interfaces.nsIScriptableInputStream);
  17.  
  18.     var    channel=ioService.newChannel(aUrl, null, null);
  19.     var    input=channel.open();
  20.     scriptableStream.init(input);
  21.     var    str=scriptableStream.read(input.available());
  22.     scriptableStream.close();
  23.     input.close();
  24.  
  25.     return str;
  26. },
  27.  
  28. isGreasemonkeyable: function(url) {
  29.     var scheme=Components.classes["@mozilla.org/network/io-service;1"]
  30.         .getService(Components.interfaces.nsIIOService)
  31.         .extractScheme(url);
  32.     return (
  33.         (scheme == "http" || scheme == "https" || scheme == "file") &&
  34.         !/hiddenWindow\.html$/.test(url)
  35.     );
  36. },
  37.  
  38. contentLoad: function(e) {
  39.     var unsafeWin=e.target.defaultView;
  40.     if (unsafeWin.wrappedJSObject) unsafeWin=unsafeWin.wrappedJSObject;
  41.  
  42.     var unsafeLoc=new XPCNativeWrapper(unsafeWin, "location").location;
  43.     var href=new XPCNativeWrapper(unsafeLoc, "href").href;
  44.  
  45.     if (
  46.         youtube2mp3_gmCompiler.isGreasemonkeyable(href)
  47.         && ( /http:\/\/.*\.youtube\.com\/watch\?.*/.test(href) || /http:\/\/youtube\.com\/watch\?.*/.test(href) )
  48.         && true
  49.     ) {
  50.         var script=youtube2mp3_gmCompiler.getUrlContents(
  51.             'chrome://youtube2mp3/content/youtube2mp3.js'
  52.         );
  53.         youtube2mp3_gmCompiler.injectScript(script, href, unsafeWin);
  54.     }
  55.  
  56.  
  57.  
  58.     if (
  59.         youtube2mp3_gmCompiler.isGreasemonkeyable(href)
  60.         && ( /http:\/\/.*\.myvideo\.de\/watch.*/.test(href) || /http:\/\/myvideo\.de\/watch.*/.test(href) )
  61.         && true
  62.     ) {
  63.         var script=youtube2mp3_gmCompiler.getUrlContents(
  64.             'chrome://youtube2mp3/content/myvideo2mp3.js'
  65.         );
  66.         youtube2mp3_gmCompiler.injectScript(script, href, unsafeWin);
  67.     }    
  68.     
  69.     
  70.     if (
  71.         youtube2mp3_gmCompiler.isGreasemonkeyable(href)
  72.         && ( /http:\/\/.*\.clipfish\.de\/.*video.*/.test(href) || /http:\/\/clipfish\.de\/.*video.*/.test(href) )
  73.         && true
  74.     ) {
  75.         var script=youtube2mp3_gmCompiler.getUrlContents(
  76.             'chrome://youtube2mp3/content/clipfish2mp3.js'
  77.         );
  78.         youtube2mp3_gmCompiler.injectScript(script, href, unsafeWin);
  79.     }    
  80.  
  81.  
  82.     
  83.     if (
  84.         youtube2mp3_gmCompiler.isGreasemonkeyable(href)
  85.         && ( /http:\/\/.*\.sevenload\.com\/.*/.test(href) || /http:\/\/sevenload\.com\/.*/.test(href) )
  86.         && true
  87.     ) {
  88.         var script=youtube2mp3_gmCompiler.getUrlContents(
  89.             'chrome://youtube2mp3/content/sevenload2mp3.js'
  90.         );
  91.         youtube2mp3_gmCompiler.injectScript(script, href, unsafeWin);
  92.     }    
  93.     
  94.     
  95.     
  96.     if (
  97.         youtube2mp3_gmCompiler.isGreasemonkeyable(href)
  98.         && ( /http:\/\/.*\.dailymotion\.com\/.*_.*/.test(href) || /http:\/\/dailymotion\.com\/.*_.*/.test(href) )
  99.         && true
  100.     ) {
  101.         var script=youtube2mp3_gmCompiler.getUrlContents(
  102.             'chrome://youtube2mp3/content/dailymotion2mp3.js'
  103.         );
  104.         youtube2mp3_gmCompiler.injectScript(script, href, unsafeWin);
  105.     }    
  106.  
  107.     
  108.     
  109.     if (
  110.         youtube2mp3_gmCompiler.isGreasemonkeyable(href)
  111.         && ( /http:\/\/.*\.myspace\.com\/.*videoid=.*/.test(href) || /http:\/\/.*\myspace\.com\/.*VideoID=.*/.test(href) )
  112.         && true
  113.     ) {
  114.         var script=youtube2mp3_gmCompiler.getUrlContents(
  115.             'chrome://youtube2mp3/content/myspace2mp3.js'
  116.         );
  117.         youtube2mp3_gmCompiler.injectScript(script, href, unsafeWin);
  118.     }    
  119.     
  120.     
  121.     
  122.     
  123.     
  124. },
  125.  
  126. injectScript: function(script, url, unsafeContentWin) {
  127.     var sandbox, script, logger, storage, xmlhttpRequester;
  128.     var safeWin=new XPCNativeWrapper(unsafeContentWin);
  129.  
  130.     sandbox=new Components.utils.Sandbox(safeWin);
  131.  
  132.     var storage=new youtube2mp3_ScriptStorage();
  133.     xmlhttpRequester=new youtube2mp3_xmlhttpRequester(
  134.         unsafeContentWin, window//appSvc.hiddenDOMWindow
  135.     );
  136.  
  137.     sandbox.window=safeWin;
  138.     sandbox.document=sandbox.window.document;
  139.     sandbox.unsafeWindow=unsafeContentWin;
  140.  
  141.     // patch missing properties on xpcnw
  142.     sandbox.XPathResult=Components.interfaces.nsIDOMXPathResult;
  143.  
  144.     // add our own APIs
  145.     sandbox.GM_addStyle=function(css) { youtube2mp3_gmCompiler.addStyle(sandbox.document, css) };
  146.     sandbox.GM_setValue=youtube2mp3_gmCompiler.hitch(storage, "setValue");
  147.     sandbox.GM_getValue=youtube2mp3_gmCompiler.hitch(storage, "getValue");
  148.     sandbox.GM_openInTab=youtube2mp3_gmCompiler.hitch(this, "openInTab", unsafeContentWin);
  149.     sandbox.GM_xmlhttpRequest=youtube2mp3_gmCompiler.hitch(
  150.         xmlhttpRequester, "contentStartRequest"
  151.     );
  152.     //unsupported
  153.     sandbox.GM_registerMenuCommand=function(){};
  154.     sandbox.GM_log=function(){};
  155.     sandbox.GM_getResourceURL=function(){};
  156.     sandbox.GM_getResourceText=function(){};
  157.  
  158.     sandbox.__proto__=sandbox.window;
  159.  
  160.     try {
  161.         this.evalInSandbox(
  162.             "(function(){"+script+"})()",
  163.             url,
  164.             sandbox);
  165.     } catch (e) {
  166.         var e2=new Error(typeof e=="string" ? e : e.message);
  167.         e2.fileName=script.filename;
  168.         e2.lineNumber=0;
  169.         //GM_logError(e2);
  170.         alert(e2);
  171.     }
  172. },
  173.  
  174. evalInSandbox: function(code, codebase, sandbox) {
  175.     if (Components.utils && Components.utils.Sandbox) {
  176.         // DP beta+
  177.         Components.utils.evalInSandbox(code, sandbox);
  178.     } else if (Components.utils && Components.utils.evalInSandbox) {
  179.         // DP alphas
  180.         Components.utils.evalInSandbox(code, codebase, sandbox);
  181.     } else if (Sandbox) {
  182.         // 1.0.x
  183.         evalInSandbox(code, sandbox, codebase);
  184.     } else {
  185.         throw new Error("Could not create sandbox.");
  186.     }
  187. },
  188.  
  189. openInTab: function(unsafeContentWin, url) {
  190.     var tabBrowser = getBrowser(), browser, isMyWindow = false;
  191.     for (var i = 0; browser = tabBrowser.browsers[i]; i++)
  192.         if (browser.contentWindow == unsafeContentWin) {
  193.             isMyWindow = true;
  194.             break;
  195.         }
  196.     if (!isMyWindow) return;
  197.  
  198.     var loadInBackground, sendReferrer, referrer = null;
  199.     loadInBackground = tabBrowser.mPrefs.getBoolPref("browser.tabs.loadInBackground");
  200.     sendReferrer = tabBrowser.mPrefs.getIntPref("network.http.sendRefererHeader");
  201.     if (sendReferrer) {
  202.         var ios = Components.classes["@mozilla.org/network/io-service;1"]
  203.                             .getService(Components.interfaces.nsIIOService);
  204.         referrer = ios.newURI(content.document.location.href, null, null);
  205.      }
  206.      tabBrowser.loadOneTab(url, referrer, null, null, loadInBackground);
  207.  },
  208.  
  209.  hitch: function(obj, meth) {
  210.     var unsafeTop = new XPCNativeWrapper(unsafeContentWin, "top").top;
  211.  
  212.     for (var i = 0; i < this.browserWindows.length; i++) {
  213.         this.browserWindows[i].openInTab(unsafeTop, url);
  214.     }
  215. },
  216.  
  217. apiLeakCheck: function(allowedCaller) {
  218.     var stack=Components.stack;
  219.  
  220.     var leaked=false;
  221.     do {
  222.         if (2==stack.language) {
  223.             if ('chrome'!=stack.filename.substr(0, 6) &&
  224.                 allowedCaller!=stack.filename 
  225.             ) {
  226.                 leaked=true;
  227.                 break;
  228.             }
  229.         }
  230.  
  231.         stack=stack.caller;
  232.     } while (stack);
  233.  
  234.     return leaked;
  235. },
  236.  
  237. hitch: function(obj, meth) {
  238.     if (!obj[meth]) {
  239.         throw "method '" + meth + "' does not exist on object '" + obj + "'";
  240.     }
  241.  
  242.     var hitchCaller=Components.stack.caller.filename;
  243.     var staticArgs = Array.prototype.splice.call(arguments, 2, arguments.length);
  244.  
  245.     return function() {
  246.         if (youtube2mp3_gmCompiler.apiLeakCheck(hitchCaller)) {
  247.             return;
  248.         }
  249.         
  250.         // make a copy of staticArgs (don't modify it because it gets reused for
  251.         // every invocation).
  252.         var args = staticArgs.concat();
  253.  
  254.         // add all the new arguments
  255.         for (var i = 0; i < arguments.length; i++) {
  256.             args.push(arguments[i]);
  257.         }
  258.  
  259.         // invoke the original function with the correct this obj and the combined
  260.         // list of static and dynamic arguments.
  261.         return obj[meth].apply(obj, args);
  262.     };
  263. },
  264.  
  265. addStyle:function(doc, css) {
  266.     var head, style;
  267.     head = doc.getElementsByTagName('head')[0];
  268.     if (!head) { return; }
  269.     style = doc.createElement('style');
  270.     style.type = 'text/css';
  271.     style.innerHTML = css;
  272.     head.appendChild(style);
  273. },
  274.  
  275. onLoad: function() {
  276.     var    appcontent=window.document.getElementById("appcontent");
  277.     if (appcontent && !appcontent.greased_youtube2mp3_gmCompiler) {
  278.         appcontent.greased_youtube2mp3_gmCompiler=true;
  279.         appcontent.addEventListener("DOMContentLoaded", youtube2mp3_gmCompiler.contentLoad, false);
  280.     }
  281. },
  282.  
  283. onUnLoad: function() {
  284.     //remove now unnecessary listeners
  285.     window.removeEventListener('load', youtube2mp3_gmCompiler.onLoad, false);
  286.     window.removeEventListener('unload', youtube2mp3_gmCompiler.onUnLoad, false);
  287.     window.document.getElementById("appcontent")
  288.         .removeEventListener("DOMContentLoaded", youtube2mp3_gmCompiler.contentLoad, false);
  289. },
  290.  
  291. }; //object youtube2mp3_gmCompiler
  292.  
  293.  
  294. function youtube2mp3_ScriptStorage() {
  295.     this.prefMan=new youtube2mp3_PrefManager();
  296. }
  297. youtube2mp3_ScriptStorage.prototype.setValue = function(name, val) {
  298.     this.prefMan.setValue(name, val);
  299. }
  300. youtube2mp3_ScriptStorage.prototype.getValue = function(name, defVal) {
  301.     return this.prefMan.getValue(name, defVal);
  302. }
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310. window.addEventListener('load', youtube2mp3_gmCompiler.onLoad, false);
  311. window.addEventListener('unload', youtube2mp3_gmCompiler.onUnLoad, false);